
# -*- coding: utf-8 -*-

from django.shortcuts import render_to_response
from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponse
from django.utils import simplejson
from django.http import HttpResponseRedirect
from django.contrib.auth.models import User
from comunidadcyt.util.permisos import puedeCrearGrupoInvestigacion, puedeEditarGrupoInvestigacion, puedeCrearGrupoInvEnDepto, \
                                    puedeAprobarIngresosGruposInv, puedeAprobarIngresoGrupoEspecifico
from comunidadcyt.departamentos.models import Departamentos
from comunidadcyt.gruposDeInvestigacion.models import GruposDeInvestigacion, SolicitudIngresoGrupo, HistorialGrupo
from comunidadcyt.gruposDeInvestigacion.forms import GruposDeInvestigacionForm, FormSolicitudIngresoGrupo, FormHistorialGrupo
from django.core.urlresolvers import reverse
from django.template.context import RequestContext
from comunidadcyt.Publicaciones.models import Libros, Conferencias, Papers, Tesis, Revistas, ReportesTecnicos
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import  ParagraphStyle as PS
from reportlab.platypus import SimpleDocTemplate, Paragraph, Image
from reportlab.platypus import Table, TableStyle, PageBreak
from reportlab.lib.units import inch
from reportlab.lib import colors
from reportlab.platypus import Spacer
import unicodedata
import os
import datetime


def obtenerGrupoI(request,object_id):
    if int(object_id):
        try:
            objectoGrupoI = GruposDeInvestigacion.objects.get(id=object_id)
        except ObjectDoesNotExist:
            return 'No existe el objecto grupo de investigacion'
    else:
        return 'No existe el objecto grupo de investigacion'
    return objectoGrupoI

def obtenerHistorialGrupo(request, object_id):
    if int(object_id):
        try:
            histGrupo = HistorialGrupo.objects.get(id=object_id)
        except ObjectDoesNotExist:
            return None
    else:
        return None
    return histGrupo

def obtenerDepto(request, object_id):
    if int(object_id):
        try:
            objectoDpto = Departamentos.objects.get(id=object_id)
        except ObjectDoesNotExist:
            return 'No existe el objecto departamento'
    else:
        return 'No existe el objecto departamento'
    return objectoDpto

def obtenerSolicitud(request, object_id):
    if int(object_id):
        try:
            solic = SolicitudIngresoGrupo.objects.get(id=object_id)
        except ObjectDoesNotExist:
            return 'No existe la solicitud'
    else:
        return 'No existe la solicitud'
    return solic

def estaEnGrupo(user, grupo):
    if user and grupo:
        for miembro in grupo.Miembros.all():
            if miembro.id == user.id:
                return True
    return False

def inicio(request):
    request.breadcrumbs('Grupos de Investigacion',request.path)
    return render_to_response(
        'gruposI/listarGruposI.html',
        {'grupos': GruposDeInvestigacion.objects.all().order_by('Nombre_grupo'),
         'puedeCrear': puedeCrearGrupoInvestigacion(request.user),
         'puedeAprobar': puedeAprobarIngresosGruposInv(request.user)},
        context_instance = RequestContext(request)
    )

def ver(request, object_id):
    grupoI = obtenerGrupoI(request, object_id)
    if grupoI == 'No existe el objecto grupo de investigacion':
        return render_to_response('error.html',{'error':'No existe el objecto grupo de investigacion', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Ver '+grupoI.Nombre_grupo,request.path)])
    return render_to_response(
        'gruposI/detalles.html',
        {'GrupoI': grupoI, 'puedeEditar': puedeEditarGrupoInvestigacion(request.user, grupoI)},
        context_instance = RequestContext(request)
    )

def solicitar_ingreso(request):
    if request.method == "GET":
        request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Solicitar Ingreso',request.path)])

        return render_to_response(
            'gruposI/solicitar_ingreso.html',
            {'form': FormSolicitudIngresoGrupo(request.user)},
            context_instance = RequestContext(request)
        )
    elif request.method == "POST":
        form = FormSolicitudIngresoGrupo(request.user, request.POST, request.FILES)
        if not estaEnGrupo(request.user, obtenerGrupoI(request, int(form.data['Grupo']))):
            if form.is_valid():
                form.save()

                return render_to_response(
                    'gruposI/solicitar_ingreso_success.html',
                    {
                        'msg': 'Se ha enviado correctamente la solicitud de ingreso al grupo seleccionado. Favor aguarde un tiempo prudencial para la aprobacion del mismo.',
                        'title': 'Solicitud de Ingreso',
                        'redirect_page': '/comunidadcyt/gruposInvestigacion/',
                        'redirect_text': 'volver'
                    },
                    context_instance = RequestContext(request)
                )
            else:
                return render_to_response(
                    'error.html',
                    {'errors': form.errors,
                     'text_to_show':'Click aqui para reintentar',
                     'redirect_page':'/comunidadcyt/gruposInvestigacion/solicitarIngreso/'},
                    context_instance = RequestContext(request)
                )
        else:
            return render_to_response(
                'error.html',
                {'errors': 'Ya eres miembro del grupo de investigacion seleccionado.',
                 'text_to_show':'volver',
                 'redirect_page':'/comunidadcyt/gruposInvestigacion/'},
                context_instance = RequestContext(request)
            )

    return HttpResponseRedirect(reverse(inicio))

def ver_solicitudes(request):
    if puedeAprobarIngresosGruposInv(request.user):
        request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Aprobar Ingresos',request.path)])
        return render_to_response(
            'gruposI/ver_solicitudes_ingreso.html',
            {'solicitudes': SolicitudIngresoGrupo.objects.all()},
            context_instance = RequestContext(request)
        )
    return HttpResponseRedirect(reverse(inicio))

def aprobar_solicitud(request, object_id):
    solicitud = obtenerSolicitud(request, object_id)
    if solicitud == 'No existe la solicitud':
        return render_to_response('error.html',{'error':'No existe la solicitud seleccionada.', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    if puedeAprobarIngresoGrupoEspecifico(request.user, solicitud.Grupo):
        solicitud.Grupo.Miembros.add(solicitud.Usuario)
        solicitud.delete()

        return render_to_response(
            'gruposI/solicitud_aprobada.html',
            {'title': 'Ingreso a Grupo de Investigacion',
             'msg': 'La solicitud de ingreso al grupo de investigacion ha sido aprobada correctamente.',
             'redirect_text': 'Volver',
             'redirect_page': '/comunidadcyt/gruposInvestigacion/verSolicitudesIngreso/'},
            context_instance = RequestContext(request)
        )
    else:
        return render_to_response(
            'error.html',
            {'errors': 'No puedes aprobar la solicitud, pues no eres responsable del grupo.',
             'text_to_show':'Volver',
             'redirect_page':'/comunidadcyt/gruposInvestigacion/verSolicitudesIngreso/'},
            context_instance = RequestContext(request)
        )

def crear(request):
    if puedeCrearGrupoInvestigacion(request.user):
        if request.method == "GET":
            request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Crear',request.path)])

            return render_to_response(
                'gruposI/grupo.html',
                {'form': GruposDeInvestigacionForm()},
                context_instance = RequestContext(request)
            )
        elif request.method == "POST":
            form = GruposDeInvestigacionForm(request.POST, request.FILES)
            if puedeCrearGrupoInvEnDepto(request.user, obtenerDepto(request, int(form.data['Departamento']))):
                if form.is_valid():
                    grupo = form.save()

                    #now create the entrance historial of members
                    for idmember in request.POST.getlist('Miembros'):
                        try:
                            user = User.objects.get(id=int(idmember))
                            hist = HistorialGrupo()
                            hist.Usuario = user
                            hist.Grupo = grupo
                            hist.Fecha = datetime.datetime.now()
                            hist.Motivo = 'Miembro al crear el grupo.'
                            hist.Tipo = 'Entrada'
                            hist.save()
                        except Exception:
                            pass

                else:
                    return render_to_response(
                        'error.html',
                        {'errors': form.errors,
                         'text_to_show':'Click aqui para reintentar',
                         'redirect_page':'/comunidadcyt/gruposInvestigacion/crear/'},
                        context_instance = RequestContext(request)
                    )
            else:
                return render_to_response(
                    'error.html',
                    {'errors': 'No eres responsable del departamento en el que quieres crear el grupo de investigacion.',
                     'text_to_show':'Click aqui para reintentar',
                     'redirect_page':'/comunidadcyt/gruposInvestigacion/crear/'},
                    context_instance = RequestContext(request)
                )

    return HttpResponseRedirect(reverse(inicio))

def getAddedMembers(prevList, actualList):
    listaNuevos = []
    for a in actualList:
        yaEstaba = False
        for p in prevList:
            if a.id == p.id:
                yaEstaba = True
                break

        if not yaEstaba:
            listaNuevos.append(a)

    return listaNuevos

def getDeletedMembers(prevList, actualList):
    listaBorrados = []
    for p in prevList:
        sigueEstando = False
        for a in actualList:
            if a.id == p.id:
                sigueEstando = True
                break

        if not sigueEstando:
            listaBorrados.append(p)

    return listaBorrados

def editar(request, object_id):
    grupoI = obtenerGrupoI(request, object_id)
    if grupoI == 'No existe el objecto grupo de investigacion':
        return render_to_response('error.html',{'error':'No existe el objecto grupo de investigacion', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    if puedeEditarGrupoInvestigacion(request.user, grupoI):
        if request.method == "GET":
            request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Editar '+grupoI.Nombre_grupo,request.path)])

            return render_to_response(
                'gruposI/editar.html',
                {'form': GruposDeInvestigacionForm(instance=grupoI), 'object_id': grupoI.id},
                context_instance = RequestContext(request)
            )
        elif request.method == "POST":
            form = GruposDeInvestigacionForm(request.POST, request.FILES, instance=grupoI)
            if puedeCrearGrupoInvEnDepto(request.user, obtenerDepto(request, int(form.data['Departamento']))):
                if form.is_valid():
                    prevMembers = [mem for  mem in grupoI.Miembros.all()]
                    grupo = form.save()
                    actualMembers = [mem for  mem in grupo.Miembros.all()]

                    #now create the entrance historial of members
                    for member in getAddedMembers(prevMembers, actualMembers):
                        try:
                            user = member
                            hist = HistorialGrupo()
                            hist.Usuario = user
                            hist.Grupo = grupo
                            hist.Fecha = datetime.datetime.now()
                            hist.Motivo = 'Miembro agregado al editar el grupo.'
                            hist.Tipo = 'Entrada'
                            hist.save()
                        except Exception:
                            pass

                    #now create the deleted historial of members
                    for member in getDeletedMembers(prevMembers, actualMembers):
                        try:
                            user = member
                            hist = HistorialGrupo()
                            hist.Usuario = user
                            hist.Grupo = grupo
                            hist.Fecha = datetime.datetime.now()
                            hist.Motivo = 'Miembro sacado al editar el grupo.'
                            hist.Tipo = 'Salida'
                            hist.save()
                        except Exception:
                            pass

                else:
                    return render_to_response(
                        'error.html',
                        {'errors': form.errors,
                         'text_to_show':'Click aqui para reintentar',
                         'redirect_page':'/comunidadcyt/gruposInvestigacion/editar/%s' % str(object_id)},
                        context_instance = RequestContext(request)
                    )
            else:
                return render_to_response(
                    'error.html',
                    {'errors': 'No eres responsable del departamento que seleccionaste.',
                     'text_to_show':'Click aqui para reintentar',
                     'redirect_page':'/comunidadcyt/gruposInvestigacion/editar/%s' % str(grupoI.id)},
                    context_instance = RequestContext(request)
                )

    return HttpResponseRedirect(reverse(inicio))

def borrar(request, object_id):
    grupoI = obtenerGrupoI(request, object_id)
    if grupoI == 'No existe el objecto grupo de investigacion':
        return render_to_response('error.html',{'error':'No existe el objecto grupo de investigacion', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    if puedeEditarGrupoInvestigacion(request.user, grupoI):
        if request.method == "GET":
            request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Borrar '+grupoI.Nombre_grupo,request.path)])

            return render_to_response(
                'gruposI/confirm_delete.html',
                {'object_id': object_id},
                context_instance = RequestContext(request)
            )
        elif request.method == "POST":
            try:
                grupoI.delete()
            except:
                pass
    return HttpResponseRedirect(reverse(inicio))

def obtenerPartners(grupoI):
    list_partners = []
    list_proyectos = grupoI.proyectos.all()
    for proyecto in list_proyectos:
        for part in proyecto.Partners.all():
            if not list_partners.__contains__(part):
                list_partners += [part]    
    return list_partners

def obtenerMiembros(grupoI):
    list_miembros = list(grupoI.Miembros.all())
    list_proyectos = grupoI.proyectos.all()
    for proy in list_proyectos:
        for miembro in proy.Miembros.all():
            if not list_miembros.__contains__(miembro):
                list_miembros += [miembro]
    return list_miembros
    #return grupoI.Miembros.all()

def obtenerLineas(grupoI):
    list_lineas = list(grupoI.Lineas.all())
    list_proyectos = grupoI.proyectos.all()
    for proyecto in list_proyectos:
        for linea in proyecto.Lineas.all():
            if not list_lineas.__contains__(linea):
                list_lineas += [linea]
    return list_lineas

def listareventos(request, object_id=0):
    grupoI = obtenerGrupoI(request, object_id)
    if grupoI == 'No existe el objecto grupo de investigacion':
        return render_to_response('error.html',{'error':'No existe el objecto grupo de investigacion', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Listar Eventos de '+grupoI.Nombre_grupo, request.path)])
    return render_to_response('gruposI/eventos.html', {'GrupoI': grupoI, 'list_eventos': grupoI.eventos.all(), 'user': request.user}, context_instance=RequestContext(request))

def listarpublicaciones(request, object_id=0):
    grupoI = obtenerGrupoI(request, object_id)
    miembros = obtenerMiembros(grupoI)
    if grupoI == 'No existe el objecto grupo de investigacion':
        return render_to_response('error.html',{'error':'No existe el objecto grupo de investigacion', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Listar Publicaciones de '+grupoI.Nombre_grupo,request.path)])
    if miembros.__contains__(request.user):
        return render_to_response('gruposI/publicaciones.html', {'GrupoI': grupoI,            
                                                             'books': Libros.objects.filter(grupos__Nombre_grupo = grupoI.Nombre_grupo),
                                                             'magazines': Revistas.objects.filter(grupos__Nombre_grupo = grupoI.Nombre_grupo),
                                                             'tesis': Tesis.objects.filter(grupos__Nombre_grupo = grupoI.Nombre_grupo),
                                                             'papers': Papers.objects.filter(grupos__Nombre_grupo = grupoI.Nombre_grupo),
                                                             'reports': ReportesTecnicos.objects.filter(grupos__Nombre_grupo = grupoI.Nombre_grupo), 
                                                             'conferences': Conferencias.objects.filter(grupos__Nombre_grupo = grupoI.Nombre_grupo), 
                                                             'user': request.user}, context_instance=RequestContext(request))
    else:
        return render_to_response('gruposI/publicaciones.html', {'GrupoI': grupoI,            
                                                             'books': Libros.objects.filter(grupos__Nombre_grupo = grupoI.Nombre_grupo),
                                                             'magazines': Revistas.objects.filter(grupos__Nombre_grupo = grupoI.Nombre_grupo),
                                                             'tesis': Tesis.objects.filter(grupos__Nombre_grupo = grupoI.Nombre_grupo),
                                                             'papers': Papers.objects.filter(grupos__Nombre_grupo = grupoI.Nombre_grupo),
                                                             'reports': ReportesTecnicos.objects.filter(grupos__Nombre_grupo = grupoI.Nombre_grupo), 
                                                             'conferences': Conferencias.objects.filter(grupos__Nombre_grupo = grupoI.Nombre_grupo), 
                                                             'user': request.user}, context_instance=RequestContext(request))

def editarHistorial(request, object_id=0):
    hist = obtenerHistorialGrupo(request, object_id)
    if hist is None:
        return render_to_response('error.html',{'error':'No existe el historial solicitado.', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    if puedeEditarGrupoInvestigacion(request.user, hist.Grupo):
        if request.method == "GET":
            request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Editar Historial',request.path)])

            return render_to_response(
                'gruposI/edit_historial.html',
                {'form': FormHistorialGrupo(hist, instance=hist), 'object_id': hist.id},
                context_instance = RequestContext(request)
            )
        elif request.method == "POST":
            form = FormHistorialGrupo(hist, request.POST, request.FILES, instance=hist)
            if puedeEditarGrupoInvestigacion(request.user, hist.Grupo):
                if form.is_valid():
                    hist = form.save()
                    return HttpResponseRedirect('/comunidadcyt/gruposInvestigacion/historial/%s' % str(hist.Grupo.id))
                else:
                    return render_to_response(
                        'error.html',
                        {'errors': form.errors,
                         'text_to_show':'Click aqui para reintentar',
                         'redirect_page':'/comunidadcyt/gruposInvestigacion/editarHistorial/%s' % str(object_id)},
                        context_instance = RequestContext(request)
                    )
            else:
                return render_to_response(
                    'error.html',
                    {'errors': 'No tienens permisos para modificar el historial del grupo.',
                     'text_to_show':'Click aqui para reintentar',
                     'redirect_page':'/comunidadcyt/gruposInvestigacion/editarHistorial/%s' % str(object_id)},
                    context_instance = RequestContext(request)
                )

    return HttpResponseRedirect(reverse(inicio))

def borrarHistorial(request, object_id=0):
    hist = obtenerHistorialGrupo(request, object_id)
    if hist is None:
        return render_to_response('error.html',{'error':'No existe el historial solicitado.', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    if puedeEditarGrupoInvestigacion(request.user, hist.Grupo):
        if request.method == "GET":
            request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Borrar Historial',request.path)])

            return render_to_response(
                'gruposI/confirm_delete_historial.html',
                {'object_id': object_id},
                context_instance = RequestContext(request)
            )
        elif request.method == "POST":
            try:
                hist.delete()
            except:
                pass
            return HttpResponseRedirect('/comunidadcyt/gruposInvestigacion/historial/%s' % str(hist.Grupo.id))
    return HttpResponseRedirect(reverse(inicio))

def historial(request, object_id=0):
    grupoI = obtenerGrupoI(request, object_id)
    if grupoI == 'No existe el objecto grupo de investigacion':
        return render_to_response('error.html',{'error':'No existe el objecto grupo de investigacion', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    listaHistorial = HistorialGrupo.objects.filter(Grupo=grupoI).all()

    request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Historial de '+grupoI.Nombre_grupo,request.path)])
    return render_to_response('gruposI/historial.html', {'GrupoI': grupoI, 'listaHistorial': listaHistorial, 'user': request.user}, context_instance=RequestContext(request))

def listarlineas(request, object_id=0):
    grupoI = obtenerGrupoI(request, object_id)
    if grupoI == 'No existe el objecto grupo de investigacion':
        return render_to_response('error.html',{'error':'No existe el objecto grupo de investigacion', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Listar Lineas de '+grupoI.Nombre_grupo,request.path)])
    return render_to_response('gruposI/lineas.html', {'GrupoI': grupoI, 'list_lineas': obtenerLineas(grupoI), 'user': request.user}, context_instance=RequestContext(request))

def listarproyectos(request, object_id=0):
    grupoI = obtenerGrupoI(request, object_id)
    if grupoI == 'No existe el objecto grupo de investigacion':
        return render_to_response('error.html',{'error':'No existe el objecto grupo de investigacion', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Listar Proyectos de '+grupoI.Nombre_grupo,request.path)])
    return render_to_response('gruposI/proyectos.html', {'GrupoI': grupoI, 'list_proyectos': grupoI.proyectos.all(), 'user': request.user}, context_instance=RequestContext(request))

def listarmiembros(request, object_id=0):
    grupoI = obtenerGrupoI(request, object_id)
    if grupoI == 'No existe el objecto grupo de investigacion':
        return render_to_response('error.html',{'error':'No existe el objecto grupo de investigacion', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Listar Miembros de '+grupoI.Nombre_grupo,request.path)])
    return render_to_response('gruposI/miembros.html', {'GrupoI': grupoI, 'list_miembros': obtenerMiembros(grupoI), 'user': request.user}, context_instance=RequestContext(request))

def listarpartners(request, object_id=0):
    grupoI = obtenerGrupoI(request, object_id)
    if grupoI == 'No existe el objecto grupo de investigacion':
        return render_to_response('error.html',{'error':'No existe el objecto grupo de investigacion', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Listar Partners de '+grupoI.Nombre_grupo,request.path)])
    return render_to_response('gruposI/partners.html', {'GrupoI': grupoI, 'list_partners': obtenerPartners(grupoI), 'user': request.user}, context_instance=RequestContext(request))

def misGrupos(request):
    object_list = GruposDeInvestigacion.objects.filter(Miembros=request.user).distinct()
    request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Mis Grupos',reverse(misGrupos))])
    return render_to_response('gruposI/listarGruposI.html',{'object_list': object_list, 'user': request.user}, context_instance=RequestContext(request))

def xhr_list_groups_view(request,key_xhr):
    response_dict = {}
    gl = GruposDeInvestigacion.objects.all()
    nl = []
    idl = []
    for item in gl:
        nl.append(item.Nombre_grupo)
        idl.append(item.id)   
    response_dict.update({'list':nl})
    response_dict.update({'idlist':idl})
    return HttpResponse(simplejson.dumps(response_dict), mimetype='application/javascript')


def generarCV(request , object_id):

    grupoI = obtenerGrupoI(request, object_id)
    if grupoI == 'No existe el objecto grupo de investigacion':
        return render_to_response('error.html',{'error':'No existe el objecto grupo de investigacion', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    list_miembros = list(obtenerMiembros(grupoI))
    list_responsables = [resp for resp in grupoI.Responsables.all()]
    list_proyectos = list(grupoI.proyectos.all())
    depto = grupoI.Departamento
    list_lineas = list(obtenerLineas(grupoI))
    list_partners = list(obtenerPartners(grupoI))


    nombre = "CV_" + unicodedata.normalize('NFKD', grupoI.Nombre_grupo).encode('ascii','ignore').replace(" ", "")

    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'inline; filename=%s' % nombre

    doc = SimpleDocTemplate(response, pagesize=A4, title=nombre, author="LED UCA")

    story = []

    h1 = PS (name = 'Heading 1', fontSize = 16, leading = 16, alignment = 1, textColor = colors.darkgreen)
    h2 = PS (name = 'Heading 2', fontSize = 12, leading = 14, alignment = 0, textColor = colors.blue)
    h2c = PS (name = 'Heading 2', fontSize = 12, leading = 14, alignment = 1, textColor = colors.blue)
    h3 = PS (name = 'Heading 3', fontSize = 12, leading = 14, alignment = 0)
    h3c = PS (name = 'Heading 3', fontSize = 12, leading = 14, alignment = 1)
    body_style = PS (name = 'Body', fontSize = 10, leading = 12)
    table_style = TableStyle ([ ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('BOX', (0,0), (-1,-1), 0.25, colors.white) ])

    P = Paragraph("Informe de Grupo de Investigación", h1)
    story.append(P)
    #--------------------------------------------------------------------------------------------
    story.append(Spacer(0,12))
    story.append(Spacer(0,12))
    story.append(Spacer(0,12))
    path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + grupoI.Imagen.url.replace('/',os.sep)
    img = Image(path, width=140, height=140)
    img.hAlign = 'CENTER'
    story.append(img)
    story.append(Spacer(0,12))
    story.append(Spacer(0,12))


    story.append(Paragraph("Grupo de Investigación", h2c))
    story.append(Spacer(0,6))
    story.append(Paragraph(grupoI.Nombre_grupo, h3c))
    story.append(Spacer(0,12))
    story.append(Spacer(0,12))

    story.append(Paragraph("Departamento", h2c))
    story.append(Spacer(0,6))
    story.append(Paragraph(depto.Nombre_departamento, h3c))
    story.append(Spacer(0,12))
    story.append(Spacer(0,12))

    if grupoI.Fecha_creacion:
        story.append(Paragraph("Fecha de creacion", h2c))
        story.append(Spacer(0,6))
        story.append(Paragraph(str(grupoI.Fecha_creacion), h3c))
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))

    if grupoI.Descripcion_grupo and grupoI.Descripcion_grupo != "":
        story.append(Paragraph("Descripción", h2c))
        story.append(Spacer(0,6))
        story.append(Paragraph(grupoI.Descripcion_grupo, h3c))
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))

    story.append(PageBreak())

    #--------------------------------------------------------------------------------------------
    if list_responsables:
        P = Paragraph("Responsables del grupo:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_miembros:
            respTitle = ''
            if p.get_profile().titulo and p.get_profile().titulo != '---':
                respTitle = p.get_profile().titulo + ' '
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.get_profile().foto.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([
                img,
                [Paragraph(respTitle + p.first_name + ' ' + p.last_name, h3), Paragraph(p.email, body_style)]
            ])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_responsables.__len__()),1,colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)

    #--------------------------------------------------------------------------------------------
    if list_miembros:
        P = Paragraph("Miembros del grupo:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_miembros:
            respTitle = ''
            if p.get_profile().titulo and p.get_profile().titulo != '---':
                respTitle = p.get_profile().titulo + ' '
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.get_profile().foto.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([
                img,
                [Paragraph(respTitle + p.first_name + ' ' + p.last_name, h3), Paragraph(p.email, body_style)]
            ])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_miembros.__len__()),1,colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
    #--------------------------------------------------------------------------------------------
    if list_lineas:
        story.append(Spacer(0,12))
        P = Paragraph("Líneas de investigación del grupo:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_lineas:
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.Imagen.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([img, [Paragraph(p.Nombre_linea,h3), Paragraph(p.Descripcion_linea,body_style)]])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_lineas.__len__()),1, colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
    #--------------------------------------------------------------------------------------------
    if list_proyectos:
        story.append(Spacer(0,12))
        P = Paragraph("Proyectos de investigación del grupo:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_proyectos:
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.Imagen.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([img, [Paragraph(p.Nombre_proyecto,h3), Paragraph(p.Descripcion_proyecto,body_style)]])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_proyectos.__len__()),1, colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
    #--------------------------------------------------------------------------------------------
    if list_partners:
        story.append(Spacer(0,12))
        P = Paragraph("Partners del grupo:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_partners:
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.Imagen.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([img, [Paragraph(p.Nombre_partner,h3), Paragraph(p.Descripcion_partner,body_style)]])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_partners.__len__()),1, colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
    #--------------------------------------------------------------------------------------------

    doc.build(story)

    return response


